package com.snopy.leetcode.index1_1000.index701_800;

/**
 * @author snopy
 * @version 1.0.0
 * @classname Question780
 * @description 到达终点 hard
 *给定四个整数sx,sy，tx和ty，如果通过一系列的转换可以从起点(sx, sy)到达终点(tx, ty)，则返回 true，否则返回false。
 *
 * 从点(x, y)可以转换到(x, x+y) 或者(x+y, y)。
 *
 * 示例 1:
 *
 * 输入: sx = 1, sy = 1, tx = 3, ty = 5
 * 输出: true
 * 解释:
 * 可以通过以下一系列转换从起点转换到终点：
 * (1, 1) -> (1, 2)
 * (1, 2) -> (3, 2)
 * (3, 2) -> (3, 5)
 * 示例 2:
 *
 * 输入: sx = 1, sy = 1, tx = 2, ty = 2
 * 输出: false
 * 示例 3:
 *
 * 输入: sx = 1, sy = 1, tx = 1, ty = 1
 * 输出: true
 *
 * @email 77912204@qq.com
 * @date 2022/04/09 15:55
 */
public class Question780 {
    public static void main(String[] args) {
        boolean b = reachingPoints(3, 7, 0, 0);
        System.out.println(b);
        //actuator 执行器
    }
    /**
     * @Description 反向运算
     * 对于tx==ty时， 不存在上一节点
     *    tx < ty, 则上一节点状态（tx,ty-tx）
     *    tx > ty, 则上一节点状态（tx-ty,ty）
     * @param sx:
     * @param sy:
     * @param tx:
     * @param ty:
     * @return: boolean
     * @Date 2022-04-09
     * @Author txl77912204@gmail.com
     **/
    public static boolean reachingPoints(int sx, int sy, int tx, int ty) {
        while (tx > sx && ty> sy && tx != ty){
            if (ty > tx){
                ty = ty%tx;
            }else{
                tx = tx%ty;
            }
        }
        if (tx == sx && ty == sy){
            return true;
        }else if(tx == sx){
            return ty > sy && (ty - sy) % tx == 0;
        }else if (ty == sy){
            return tx > sx &&(tx - sx) % ty == 0;
        }
        return false;
    }
}
